package cn.jussi.listener;

import java.util.Date;

import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import cn.jussi.mvcproject.model.Online;
import cn.jussi.mvcproject.service.FactoryService;
import cn.jussi.mvcproject.service.OnlineService;

/**
 * 
 * @author 范俊熙
 * 基本思路：
 *1.当请求进来的时候，记录访问者的信息，判断访问者是否存在数据库中，存在更新访问时间和访问页面，不存在写到数据库
 *2.记录在线用户的时候，记录访问过来的时间，如果用户10分钟没有操作，用户离线，数据表中的在线记录删除
 *3.访问者登入成功后，将online数据表里的username，从 游客 改为 真正的 username
 *4.ServletContextLintener, web应用启动的时候，要每 5s 检查一次过期用户，并且执行删除操作
 *
 */
@WebListener
public class OnlineRequestListener implements ServletRequestListener{

	//Service 对象，请求操作数据库
	OnlineService onlineService = FactoryService.getOnlineService();

	@Override
	public void requestDestroyed(ServletRequestEvent event) {
		/*HttpServletRequest req = (HttpServletRequest) event.getServletRequest();
		HttpSession session = req.getSession();
		//获取session的id
		String ssid = session.getId();
		onlineService.deleteExpiresOnline(ssid);*/
	}

	@Override
	public void requestInitialized(ServletRequestEvent event) {
		//通过请求拿到访问者的基本信息
		HttpServletRequest req = (HttpServletRequest) event.getServletRequest();
		HttpSession session = req.getSession();
		//获取session的id
		String ssid = session.getId();
		//获取访问者的ip地址
		String ip = req.getRemoteAddr();
		//获取访问者正在访问的页面
		String page = req.getRequestURI();
		//获取用户名称
		String username = (String) session.getAttribute("user");
		username = username==null? "游客":username;
		
		//操作数据库之前，把这些信息封装到一个online里
		Online ol = new Online();
		ol.setSsid(ssid);
		ol.setUsername(username);
		ol.setPage(page);
		ol.setIp(ip);
		ol.setTime(new Date());
		
		//链接数据库，把信息放到数据库，有：更新数据库, 没有，插入新记录
		//1.根据ssid，查询数据库是否有记录
		Online online = onlineService.getOnlineBySsid(ssid);
		if(online != null) {
			//2.更新这条记录里的time和page
			online.setTime(new Date());
			online.setPage(page);
			onlineService.updateOnline(online);
		}else {
			onlineService.insertOnline(ol);
		}
	}

}
